#include <iostream>
#include <pthread.h>
#include <string>
#include <cerrno>
#include <cstring>
#include <cstdio>
#include <unistd.h>

using std::cout;
using std::endl;
using std::string;

// // 创建线程
// int x = 100;
// void show(const string& name)
// {
//     cout << name << ", pid: " << getpid() << " " << x << "\n" << endl;
// }

// void* threadRun(void* args)
// {
//     const string name = (char*)args;
//     while (true)
//     {
//         show(name);
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid[5];
//     char name[64];
//     for (int i = 0; i < 5; i++)
//     {
//         snprintf(name, sizeof name, "%s-%d", "thread", i);
//         pthread_create(tid + i, nullptr, threadRun, (void*)name);
//         sleep(1);
//     }

//     while (1)
//     {
//         cout << "main thread pid: " << getpid() << endl;
//         sleep(2);
//     }
//     return 0;
// }

// // 线程控制
// void* threadRoutine(void* args)
// {
//     int i = 0;
//     int* data = new int[10];
//     while (true)
//     {
//         cout << "新线程: " << (char*) args << "running ..." << pthread_self() << endl;
//         sleep(1);
//         data[i] = i;
//         i++;
//         //if (i = 5) break;
//     }

//     //pthread_exit((void*)1);   // 线程退出

//     cout << "new thread quit ..." << endl;
//     return (void*)data;
// }

// int main()
// {
//     pthread_t tid;  // 线程地址
//     pthread_create(&tid, nullptr, threadRoutine, (void*) "thread 1"); // 创建线程
//     printf("%lu, %p\n", tid, tid);

//     int count = 0;
//     while (true)
//     {
//         cout << "main 线程: " << "running" << endl;
//         sleep(1);
//         count++;
//         if (count == 3) break;
//     }

//     int* ret = nullptr;
//     pthread_cancel(tid);  // 线程取消
//     pthread_join(tid, (void**)&ret); // 线程等待

//     cout << " main thread wait done... main quit....: new thread quit code: " << (long long)ret << endl;
//     sleep(5);

//     // for (int i = 0; i < 10; i++)
//     // {
//     //     cout << ret[i] << endl;
//     // }
//     return 0;
// }



// // 全局变量共享
// int g_val = 0;
// __thread int G_val = 100;
// void *threadRoutine(void *args)
// {
//     //pthread_detach(pthread_self());   // 线程分离
//     while (true)
//     {
//         cout << (char *)args << ": " << g_val << " &: " << &g_val << endl;
//         cout << (char *)args << ": " << G_val << " &: " << &G_val << endl;
//         g_val++;
//         G_val++;
//         sleep(1);
//         break;
//     }

//     pthread_exit((void *)1);
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void *)"thread 1 ");

//     while (true)
//     {
//         cout << "main thread: " << g_val << " &: " << &g_val << endl;
//         cout << "main thread: " << G_val << " &: " << &G_val << endl;
//         sleep(1);
//         break;
//     }

//     int n = pthread_join(tid, nullptr);
//     cout << "线程等待返回值: " << n  << " errstring" << strerror(n) << endl;
//     return 0;
// }



// 多线程访问一个全局变量,并对他进行数据计算,多线程会相互影响吗？   线程互斥和线程分离
int tickets = 1000;

void* getTicket(void* args)
{
    pthread_detach(pthread_self());   // 使用线程分离,主线程不用等待
    (void) args;

    while (true)
    {
        if (tickets > 0)
        {
            usleep(1000);
            printf("%p: %d\n", pthread_self(), tickets);
            tickets--;
        }
        else
        {
            break;
        }
    }

    return nullptr;
}

int main()
{
    pthread_t t1, t2, t3;

    // 多线程抢票
    pthread_create(&t1, nullptr, getTicket, nullptr);

    while (1) sleep(1);
    return 0;
}
